package com.ljf.framework.security;


import com.ljf.framework.LjfManager;
import com.ljf.framework.cache.LjfCacheManager;
import com.ljf.framework.context.LjfContextManager;
import com.ljf.framework.log.LjfLogManager;
import com.ljf.framework.log.LjfLogService;
import com.ljf.framework.result.JsonResult;
import com.ljf.framework.security.token.LjfTokenConfig;
import com.ljf.framework.security.token.LjfTokenManager;
import com.ljf.framework.security.token.LjfTokenConstants;

/**
 * 安全管理类，只负责调用执行，具体执行逻辑由LjfSecurityService实现
 */
public class LjfSecurityManager {

    static LjfLogService log = LjfLogManager.getLogger(LjfSecurityManager.class);

    /**
     * 获取用户ID
     */
    public static Long getUserId() {
        return LjfManager.getLjfSecurityService().getUserId();
    }

    /**
     * 登录操作
     */
    public static JsonResult doLogin(String username, String password) {
         return LjfManager.getLjfSecurityService().doLogin(username,password);
    }

    /**
     * 会话登录，这里说明已经认证成功
     * @param userId 用户id，建议的类型：（long | int | String）
     */
    public static void login(Long userId) {
        log.info("登录用户userId：" + userId);

        String token = LjfTokenManager.createToken(userId);
        // 缓存 userId -token 对应关系
        LjfCacheManager.set(SecurityConstants.LOGIN_USER_PREFIX+userId,token,LjfTokenManager.getLjfTokenConfig().getTimeout());
        // 将token 添加到 cookie 中
        LjfTokenManager.setTokenValueToCookie(token,60*30);
        // 将token 添加到 ljfContext 中
        LjfContextManager.getStorage().set(LjfTokenConstants.JUST_CREATED,token);
    }

    /**
     * 根据用户id创建token
     *
     * @param userId
     * @return
     */
    public static String createToken(Long userId) {
        String ljfToken = LjfManager.getLjfSecurityService().createLjfToken(userId);

        return ljfToken;
    }

    /**
     * 登出操作
     */
    public static JsonResult doLogout() {
        return LjfManager.getLjfSecurityService().doLogout();
    }

    /**
     * 是否登录
     */
    public static boolean isLogin() {
        return LjfManager.getLjfSecurityService().isLogin();
    }

    /**
     * 是否登录
     */
    public static String getUsername(String tokenValue) {
        return LjfManager.getLjfSecurityService().getUsername(tokenValue);
    }

    /**
     * 是否登录
     */
    public static String getUsername() {
        return LjfManager.getLjfSecurityService().getUsername();
    }

    /**
     * 安全配置
     */
    private static volatile LjfSecurityConfig config;
    public static void setConfig(LjfSecurityConfig ljfSecurityConfig) {
        LjfSecurityManager.config = ljfSecurityConfig;
    }
    public static LjfSecurityConfig getConfig() {
        if (config == null) {
            // 初始化默认值
            synchronized (LjfSecurityManager.class) {
                if (config == null) {
                    setConfig(new LjfSecurityConfig());
                }
            }
        }
        return config;
    }



    /**
     * 获取请求token
     */
    public static String getTokenValue() {
        return LjfTokenManager.getTokenValue();
    }

    public static LjfTokenConfig getTokenConfig() {
        return LjfManager.getLjfTokenConfig();
    }
}
